home *** CD-ROM | disk | FTP | other *** search
/ ftp.alaska-software.com / 2014.06.ftp.alaska-software.com.tar / ftp.alaska-software.com / 3pp / mxsetup.old / {app} / FileDlg.prg < prev    next >
Text File  |  2001-09-14  |  12KB  |  411 lines

  1. **********************************************************************
  2. *  FUNCTION MxFileDialog( oWin,;
  3. *                         cTitle,;
  4. *                         lOpen,;
  5. *                         aFilter,;
  6. *                         cPath,;
  7. *                         lShowReadonly,;
  8. *                         lAllowMultiSelect,;
  9. *                         lPathMustExist,;
  10. *                         lFileMustExist)
  11. *                  --> aFileNames
  12. *  All Parameters are Optional - if no parameters are entered, a File
  13. *  Open Dialog will be initiated in MultiSelect Mode - see below for 
  14. *  the default Values of the various parameters.
  15. **********************************************************************
  16. *  This Program provides a replacement File Open Dialog for the Alaska
  17. *  XbpFileDialog() Class which isn't complete in implementation.
  18. *  It requires BAP.DLL & BAP.LIB available from the Alaska Web site.
  19. *  This code was created by Joe Carrick based on prior code by:
  20. *    Ken Levitt based on code from Steffen Rabek and Gernot Trautmann.
  21. *  Note that the return Value is an Array of File Names, each of which
  22. *  is complete with the full path.  The OpenFile routine only returns
  23. *  a String which either contains a full file name with path
  24. *  -or-
  25. *  a String with a Path, followed by File Names separated by chr(0).
  26. *  The Array is much easier to extract the File Names from.
  27. *   -If lOpen is True and lAllowMultiSelect is True then the Array may
  28. *    contain more than one element, depending on how may Files were 
  29. *    selected.
  30. *   -If lOpen is False (Save Dialog) then the Array will contain a max
  31. *    of one element.
  32. *   -If the Array is empty, then no Files were selected.
  33. **********************************************************************
  34. *  NO ACTUAL OPENING OR CLOSING OF FILES IS PROVIDED BY THIS ROUTINE
  35. **********************************************************************
  36. *  The DLLFUNCTION calls makes the GetOpenFileNameA system call available
  37. *  for later use.  The parameter "cStru" is a dummy place holder indicating
  38. *  that a character based structure will be passed to GetOpenFileNameA
  39. *  when it is used in execution.  The name "cStru" is meaningless and
  40. *  could be any name.  It is just there to indicate that 1 parameter will
  41. *  be passed.
  42. **********************************************************************
  43.  
  44. #include "Dll.ch"
  45. #include "Xbp.ch"
  46. #include "Common.ch"
  47. #pragma Library( "BAP.LIB" )
  48.  
  49. DLLFUNCTION GetOpenFileNameA( cStru ) USING STDCALL FROM COMDLG32.DLL
  50. DLLFUNCTION GetSaveFileNameA( cStru ) USING STDCALL FROM COMDLG32.DLL
  51.  
  52. **********************************************************************
  53. *  The Following are required to convert from the True/False inputs to
  54. *  nFlags for the OpenFile Function Call - Comments eliminated in this
  55. *  Listing.
  56. **********************************************************************
  57.  
  58. #define WORD chr(0)+chr(0)
  59. #define NULL 0
  60.  
  61. #define OFN_ALLOWMULTISELECT        0x00000200    //512
  62. #define OFN_EXPLORER            0x00080000    //0x80000
  63. #define OFN_FILEMUSTEXIST        0x00001000    //0x1000
  64. #define OFN_HIDEREADONLY        0x00000004    //4
  65. #define OFN_PATHMUSTEXIST        0x00000800    //0x800
  66. #define OFN_READONLY            0x00000001    //1
  67. #define OFN_SHAREAWARE            0x00004000    //0x4000
  68.  
  69. /*
  70. #define OFN_ALLOWMULTISELECT        512
  71. #define OFN_EXPLORER            0x80000
  72. #define OFN_FILEMUSTEXIST        0x1000
  73. #define OFN_HIDEREADONLY        4
  74. #define OFN_PATHMUSTEXIST        0x800
  75. #define OFN_READONLY            1
  76. #define OFN_SHAREAWARE            0x4000
  77. */
  78.  
  79. ************************************************************************
  80. *   FILE OPEN/SAVE DIALOG
  81. *      INPUT Parameters:
  82. *         oWin              Parent Window Object
  83. *         cTitle            Title of File Dialog 
  84. *         lOpen             .T. --- Open File Dialog (Default)
  85. *                           .F. --- Save File Dialog
  86. *         aFilter           Array of File Types with FilterStrings
  87. *                           {{ "Program Files (*.PRG)", "*.PRG"},...}
  88. *                           These items populate the File Types List Box
  89. *         cPath             Starting drive and path
  90. *         lShowReadonlyBox  .F.=Default
  91. *         lAllowMultiSelect .T.=Default for Open Dialog
  92. *                           .F.=Always for Save Dialog
  93. *         lPathMustExist    .T.=Default
  94. *         lFileMustExist    .F.=Default
  95. *      OUTPUT Parameter
  96. *         aFileNames        Array of File Names Selected including Path
  97. *************************************************************************
  98.  
  99. FUNCTION MxFileDialog( oWin,;
  100.                         cTitle,;
  101.                         lOpen,;
  102.                         aFilter,;
  103.                         cPath,;
  104.                         lShowReadonly,;
  105.                         lAllowMultiSelect,;
  106.                         lPathMustExist,;
  107.                         lFileMustExist)
  108.  
  109.     LOCAL cFile     := ""
  110.     LOCAL cDir      := ""
  111.     LOCAL aFileNames := {}
  112.     LOCAL i,nFlags  := OFN_EXPLORER+OFN_SHAREAWARE
  113.  
  114.     DEFAULT cTitle to "File Dialog"
  115.     DEFAULT lOpen to .T.
  116.     DEFAULT aFilter to {}
  117.     DEFAULT cPath to ""
  118.     DEFAULT lShowReadOnly to .F.
  119.     DEFAULT lPathMustExist to .T.
  120.     DEFAULT lFileMustExist to .F.
  121.  
  122.     if lOpen
  123.         DEFAULT lAllowMultiSelect to .T.
  124.     else
  125.         lAllowMultiSelect := .F.
  126.     endif
  127.  
  128.     if lFileMustExist
  129.         lPathMustExist := .T.
  130.     endif
  131.  
  132.     if lAllowMultiSelect
  133.         nFlags := nFlags+OFN_ALLOWMULTISELECT
  134.     endif
  135.     if !lShowReadOnly
  136.         nFlags := nFlags+OFN_HIDEREADONLY
  137.     endif
  138.     if lPathMustExist
  139.         nFlags := nFlags+OFN_PATHMUSTEXIST
  140.     endif
  141.     if lFileMustExist
  142.         nFlags := nFlags+OFN_FILEMUSTEXIST
  143.     endif
  144.  
  145.     cFile := OpenFile( oWin, cTitle, lOpen, aFilter, cPath, nFlags )
  146.  
  147.     do while right(cFile,1)==chr(0)
  148.         cFile := left(cFile,len(cFile)-1)
  149.     enddo
  150.     if chr(0)$cFile
  151.         cDir := left(cFile,at(chr(0),cFile)-1)+"\"
  152.     else
  153.         cDir := left(cFile,rat("\",cFile))
  154.     endif
  155.     cFile := right(cFile,len(cFile)-len(cDir))
  156.     do while !empty(cFile)
  157.         do while left(cFile,1)==chr(0)
  158.             cFile := right(cFile,len(cFile)-1)
  159.         enddo
  160.         if chr(0)$cFile
  161.             i := at(chr(0),cFile)-1
  162.         else
  163.             i := len(cFile)
  164.         endif
  165.         aAdd(aFileNames,cDir+left(cFile,i))
  166.         cFile := right(cFile,len(cFile)-i)
  167.     enddo
  168.  
  169. RETURN aFileNames
  170.  
  171.  
  172.  
  173. FUNCTION OpenFile( oWin, cTitle, lOpen, aFilter, cPath, nFlags )
  174. *********************************************************
  175. * nFlags = OFN flags added together
  176. *********************************************************
  177.  
  178.     LOCAL hWnd      := IIF(oWin=NIL,;
  179.                        IIf(SetAppWindow()<>Nil,SetAppWindow():getHWND(),AppDeskTop()),;
  180.                        oWin:getHWND())
  181.     LOCAL cLeer     := ""
  182.     LOCAL cFilter   := ""
  183.     LOCAL cFileName := replicate(CHR(0), 260)    // 260 bytes are required
  184.     LOCAL aOFN
  185.     LOCAL cOFN
  186.     LOCAL nHook     := 0
  187.     LOCAL i
  188.     LOCAL ret       := ""
  189.  
  190.     *** Build file extension filtering options ***
  191.  
  192.     IF LEN(aFilter) > 0
  193.         FOR i = 1 TO LEN(aFilter)
  194.             cFilter += aFilter[i,1]+CHR(0)+aFilter[i,2]+CHR(0)
  195.         NEXT
  196.         cFilter += CHR(0)
  197.     ENDIF
  198.  
  199.     ***********************************************************
  200.     *  Following Code requires the BAP Library
  201.     ***********************************************************
  202.  
  203.     aOFN = BaInit(20)          // BAP.DLL from Gernot Trautmann
  204.  
  205.     BaStruct(aOFN,76)              // lStructSize
  206.     BaStruct(aOFN,hWnd)            // hwndOwner
  207.     BaStruct(aOFN,NULL)            // hInstance
  208.     BaStruct(aOFN,@cFilter)        // lpstrFilter
  209.     BaStruct(aOFN,NULL)            // lpstrCustomFilter
  210.     BaStruct(aOFN,0)               // nMaxCustFilter
  211.     BaStruct(aOFN,1)               // nFilterIndex
  212.     BaStruct(aOFN,@cFileName)      // lpstrFile
  213.     BaStruct(aOFN,LEN(cFileName))  // nMaxFile
  214.     BaStruct(aOFN,NULL)            // lpstrFileTitle
  215.     BaStruct(aOFN,0)               // nMaxFileTitle
  216.     BaStruct(aOFN,@cPath)          // lpstrInitialDir
  217.     BaStruct(aOFN,@cTitle)         // lpstrTitle
  218.     BaStruct(aOFN,nflags)          // Flags
  219.     BaStruct(aOFN,WORD)            // nFileOffset
  220.     BaStruct(aOFN,WORD)            // nFileExtension
  221.     BaStruct(aOFN,NULL)            // lpstrDefExt
  222.     BaStruct(aOFN,NULL)            // lCustData
  223.     BaStruct(aOFN,nHook)           // lpfnHook function link or 0
  224.     BaStruct(aOFN,NULL)            // lpTemplateName
  225.  
  226.     cOFN = BaAccess(aOFN)
  227.  
  228.     if lOpen
  229.         GetOpenFileNameA(cOFN)
  230.     else
  231.         GetSaveFileNameA(cOFN)
  232.     endif
  233.  
  234.     FOR i = 1 TO 8
  235.         ret = BaExtract(aOFN)
  236.     NEXT
  237.  
  238. RETURN (IIF(LEFT(ret,1)=CHR(0),"",ret))
  239.  
  240.  
  241.  
  242. PROCEDURE MxFileOpen(aPos,lCenter,aFilter)
  243.  
  244.     LOCAL aFileNames := {}, aSize := setAppWindow():drawingArea:currentSize()
  245.     LOCAL cCmdLine := "", cFile
  246.     LOCAL oWin, oFiles, oFocus := setAppFocus()
  247.  
  248.     DEFAULT lCenter to .F.
  249.     DEFAULT aPos to {1,aSize[2]-300}
  250.     DEFAULT aFilter to {}
  251.  
  252.     oFiles := FileDialog():new()
  253.     oFiles:fileMustExist := .T.
  254.     oFiles:center  := lCenter
  255.     oFiles:filter := aFilter
  256.     oFiles:create(,,aPos)
  257.  
  258.     aFileNames := oFiles:aFileNames
  259.  
  260.     setAppFocus(oFocus)
  261.     oFiles:destroy()
  262.  
  263.     if !empty(aFileNames)
  264.         if lower(right(alltrim(aFileNames[1]),3))=="exe"
  265.             RunShell("",aFileNames[1] )
  266.         else
  267.             cCmdLine := '/C START "' + aFileNames[1] + '"'
  268.             RunShell( cCmdLine )
  269.         endif
  270.     endif
  271.  
  272. RETURN
  273.  
  274.  
  275.  
  276.  
  277. FUNCTION MxGetFileNames(aPos,lCenter,lMultiple, aFilter)
  278.  
  279.     LOCAL aFileNames := {}, aSize := setAppWindow():drawingArea:currentSize()
  280.     LOCAL cCmdLine := "", cFile
  281.     LOCAL oWin, oFiles, oFocus := setAppFocus()
  282.  
  283.     DEFAULT lCenter to .F.
  284.     DEFAULT aPos to {1,aSize[2]-300}
  285.     DEFAULT lMultiple to .T.
  286.     DEFAULT aFilter to {}
  287.  
  288.     oFiles := FileDialog():new()
  289.     oFiles:fileMustExist := .T.
  290.     oFiles:center  := lCenter
  291.     oFiles:allowMultiSelect := lMultiple
  292.     oFiles:filter := aFilter
  293.     oFiles:create(,,aPos)
  294.  
  295.     aFileNames := oFiles:aFileNames
  296.  
  297.     setAppFocus(oFocus)
  298.     oFiles:destroy()
  299.  
  300. RETURN aFileNames
  301.  
  302.  
  303.  
  304.  
  305. FUNCTION MxSaveFileName(aPos,lCenter,aFilter)
  306.  
  307.     LOCAL cFileName := "", aSize := setAppWindow():drawingArea:currentSize()
  308.     LOCAL cCmdLine := "", cFile
  309.     LOCAL oWin, oFiles, oFocus := setAppFocus()
  310.  
  311.     DEFAULT lCenter to .F.
  312.     DEFAULT aPos to {1,aSize[2]-300}
  313.     DEFAULT aFilter to {}
  314.  
  315.     oFiles := FileDialog():new()
  316.     oFiles:fileMustExist := .F.
  317.     oFiles:center  := lCenter
  318.     oFiles:filter := aFilter
  319.     oFiles:allowMultiSelect := .F.
  320.     oFiles:lOpen := .F.
  321.     oFiles:create(,,aPos)
  322.  
  323.     cFileName := iif(!empty(oFiles:aFileNames),oFiles:aFileNames[1],"")
  324.  
  325.     setAppFocus(oFocus)
  326.     oFiles:destroy()
  327.  
  328. RETURN cFileName
  329.  
  330.  
  331.  
  332.  
  333. CLASS FileDialog from XbpDialog
  334.  
  335.     EXPORTED:
  336.         VAR oWin
  337.         VAR aFileNames
  338.         VAR title
  339.         VAR lOpen
  340.         VAR filter
  341.         VAR startPath
  342.         VAR showReadOnlyBox
  343.         VAR allowMultiSelect
  344.         VAR pathMustExist
  345.         VAR fileMustExist
  346.  
  347.         VAR center
  348.  
  349.     METHOD init, create, destroy
  350.  
  351. ENDCLASS
  352.  
  353.  
  354. METHOD FileDialog:init( oParent, oOwner, aPos )
  355.  
  356.     ::XbpDialog:init( oParent, oOwner, aPos )
  357.     ::XbpDialog:visible := .F.
  358.     ::XbpDialog:sysMenu := .F.
  359.     ::XbpDialog:titlebar := .F.
  360.     
  361.     ::aFileNames := {}
  362.     ::title      := "File Dialog"
  363.     ::lOpen      := .T.
  364.     ::filter     := {{"All Files","*.*"}}
  365.     ::startPath  := ""
  366.     ::showReadOnlyBox  := .F.
  367.     ::allowMultiSelect := .F.
  368.     ::pathMustExist    := .T.
  369.     ::fileMustExist    := .F.
  370.  
  371.     ::center := .F.
  372.  
  373. RETURN self
  374.  
  375.  
  376. METHOD FileDialog:create( oParent, oOwner, aPos )
  377.  
  378.     LOCAL aSize
  379.  
  380.     DEFAULT oParent to AppDeskTop()
  381.     DEFAULT oOwner to AppDeskTop()
  382.     DEFAULT aPos to {1,aSize[2]-300}
  383.  
  384.     aSize := oOwner:currentSize()
  385.  
  386.     ::XbpDialog:create( oParent,;
  387.                    oOwner,;
  388.                    IIf(::center,{(aSize[1]-434)/2,(aSize[2]-300)/2},aPos),;
  389.                    {434,300} )
  390.  
  391.     ::aFileNames := MxFileDialog( ::XbpDialog,;
  392.                                    ::title,;
  393.                                    ::lOpen,;
  394.                                    ::filter,;
  395.                                    ::startPath,;
  396.                                    ::showReadOnlyBox,;
  397.                                    ::allowMultiSelect,;
  398.                                    ::pathMustExist,;
  399.                                    ::fileMustExist)
  400.  
  401. RETURN self
  402.  
  403.  
  404. METHOD FileDialog:destroy()
  405.  
  406.     ::XbpDialog:destroy()
  407.  
  408. RETURN self
  409.  
  410.  
  411.